"""
计算当前月份的日期范围

问题：
    你的代码需要在当前月份中循环每一天，想找到一个计算这个日期范围的高效方法。
解决方案：
    在这样的日期上循环并需要事先构造一个包含所有日期的列表。
    你可以先计算出开始日期和结束日期， 然后在你步进的时候使用 datetime.timedelta 对象递增这个日期变量即可。
"""

import calendar
from datetime import datetime, date, timedelta


def get_month_range(start_date=None):
    if start_date is None:
        start_date = date.today().replace(day=1)

    _, days_in_month = calendar.monthrange(start_date.year, start_date.month)
    end_date = start_date + timedelta(days=days_in_month)
    return start_date, end_date


def use_month_range():
    one_day = timedelta(days=1)
    first_day, last_day = get_month_range()
    while first_day < last_day:
        print(first_day)
        first_day += one_day

    # 输出结果：
    """
    2018-05-01
    2018-05-02
    2018-05-03
    2018-05-04
    2018-05-05
    2018-05-06
    2018-05-07
    2018-05-08
    2018-05-09
    2018-05-10
    2018-05-11
    2018-05-12
    2018-05-13
    2018-05-14
    2018-05-15
    2018-05-16
    2018-05-17
    2018-05-18
    2018-05-19
    2018-05-20
    2018-05-21
    2018-05-22
    2018-05-23
    2018-05-24
    2018-05-25
    2018-05-26
    2018-05-27
    2018-05-28
    2018-05-29
    2018-05-30
    2018-05-31
    """


def date_range(start, stop, step):
    while start < stop:
        yield start
        start += step


def use_date_range():
    for d in date_range(datetime(2018, 5, 28), datetime(2018, 6, 1), timedelta(days=1)):
        print(d)
    # 输出结果：
    """
    2018-05-28 00:00:00
    2018-05-29 00:00:00
    2018-05-30 00:00:00
    2018-05-31 00:00:00
    """


if __name__ == '__main__':
    use_month_range()
    use_date_range()
